#include<bits/stdc++.h>
using namespace std;
int T,n,m,ans1,ans2,x;
double p[100010],L,V;
bool fc[100010],fm[100010];
struct car{
    int d,v,a;
}c[100010];
inline bool check(int x){
    int s;
    for(int i=1;i<=m;++i)
        if(p[i]>=c[x].d){
            s=i;
            break;
        }
    if(sqrt(c[x].v*c[x].v+2*c[x].a*(p[s]-c[x].d))>V) return true;
    return false; 
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>T;
    while(T--){
        ans1=ans2=0;
        memset(fc,true,sizeof(fc));
        memset(fm,false,sizeof(fm));
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;++i){
            cin>>c[i].d>>c[i].v>>c[i].a;
            if(c[i].a<=0&&c[i].v>V||c[i].a>0&&sqrt(c[i].v*c[i].v+2*c[i].a*(L-c[i].d))>V) fc[i]=false;
        }
        for(int i=1;i<=m;++i)
            cin>>p[i];
        for(int i=1;i<=n;++i)
            if(fc[i]==false&&(c[i].a<=0&&!check(i)||c[i].a>0&&c[i].d+(V*V-c[i].v*c[i].v)/2/c[i].a>p[m])) fc[i]=true;
        for(int i=1;i<=n;++i)
            if(!fc[i]){
                if(c[i].a>=0) fm[m]=true;
                else for(int j=m;j>=1;--j)
                    if(p[j]<=c[i].d+(V*V-c[i].v*c[i].v)/2/c[i].a){
                        fm[j]=true;
                        break;
                    }
            }
        for(int i=1;i<=n;++i)
            if(!fc[i]) ans1++;
        for(int i=1;i<=m;++i)
            if(!fm[i]) ans2++;
        cout<<ans1<<' '<<ans2<<"\n";
    }
    return 0;
}